//------------------------------------------------------------------------------
//-------------------- Clase Util ----------------------------------------
//------------------------------------------------------------------------------

//http://stackoverflow.com/questions/2778901/javascript-undefined-compare
var Util = function() {};
Util.esIndefinido = function(obj) {
    return typeof obj === "undefined";
};

Util.StringToInt = function(valor) {
    try {
        if(valor && valor!=="")
            return parseInt(valor);
    }
    catch(err) {
        
    }
    return 0;
};


//http://stackoverflow.com/questions/3915787/jsp-automatic-redirect-after-session-expire-timeout
function redireccionarAlFinalizarSesion(urlADireccionar) {    
    var timeOut = 1000 * 60 * 30; // 30 minutes
    var lastActivity = new Date().getTime();
    var checkTimeout;
    checkTimeOut = function(){
        if(new Date().getTime() > lastActivity + timeOut){
            // redirect to timeout page
            window.location = urlADireccionar;
        }else{
            window.setTimeout(checkTimeOut, 1000); // check once per second (chequea cada segundo)
        }
    };
}

//http://stackoverflow.com/questions/1985250/notify-user-about-session-timeout-in-java-ee
function avisarProximoFinSesion(tiempoMaximoSesionSegundos) {
    var secondsBeforeExpire = tiempoMaximoSesionSegundos;
    var timeToDecide = 15; // Se le da al cliente 15 segundos para decidir.
    setTimeout(function() {
        alert('Tu sesión está próxima a expirar en ' + timeToDecide + ' segundos!');
    }, (secondsBeforeExpire - timeToDecide) * 1000);
}

//http://stackoverflow.com/questions/1144805/how-do-i-scroll-to-the-top-of-the-page-with-jquery
function scrollAlInicioDePagina() {
    //document.body.scrollTop = 0;
    window.scrollTo(0,0);//scroll a las coordenadas 0,0
}

//------------------------------------------------------------------------------
//-------------------- Clase FormUtil ----------------------------------------
//------------------------------------------------------------------------------

var FormUtil = function() {};


FormUtil.getInputOne = function(idInput) {
    var input = document.getElementById(idInput);    
    if(input) {
        var tipo = input.type;
        if(tipo=="text" || tipo=="select-one" || tipo=="password")
            return input
    }
    return null;
};

FormUtil.getButtons = function(nameInput) {
    var inputs = document.getElementsByName(nameInput);
    if(inputs && inputs.length>0) {        
        //Solo reviso el tipo del primer elemento
        var tipo = inputs[0].type;
        //Para RadioButtons y Checkboxes
        if(tipo=="radio" || tipo=="checkbox") {
            return inputs; 
        }
    }     
    return null;
};

//http://stackoverflow.com/questions/9618504/get-radio-button-value-with-javascript
FormUtil.getValorRadioButtons = function(nombreRadioButtons) {
    var radios = document.getElementsByName(nombreRadioButtons);
    var length = radios.length;
    for (var i = 0; i < length; i++) {
        if (radios[i].checked) 
            return radios[i].value;
    }
    return null;
};

FormUtil.getValorTextBox = function(idInput) {
    return document.getElementById(idInput).value;
};

//Metodos estáticos

//NOTA: No es recursivo. no deshabilita Fieldsets
FormUtil.deshabilitar = function(idInput,valorBoolean) {
    //En IE, por defecto el ID del input es el mismo que su nombre    
    //con sueño y cansada    
    var input = document.getElementById(idInput);
    if(input) {
        input.disabled = valorBoolean;
        input.readOnly = valorBoolean;
    }
};

FormUtil.focus = function(input) {
    if(input.disabled) {
        input.disabled = false;
        input.focus();//focus() solo funciona para un control no deshabilitado
        input.disabled = true;    
    }
    else
        input.focus();
};


/*
FormUtil.esDeshabilitado = function(input) {
    var padre = input;    
    while(true) {        
        if(padre) {
            if(padre.disabled)
                return true;
        }
        else {
            return false;
        }
        padre = input.parentNode;
    }
};
*/

FormUtil.resetearSeleccion = function(select) {
    if(select.length>0)
        select.options[0].selected = true;
};

FormUtil.getInt = function(idInput) {
    var input = document.getElementById(idInput);    
    return Util.StringToInt(input.value);
};

FormUtil.esCheckedRadioButtonsByNombre = function(nombreRadioButtons) {
    var radios = document.getElementsByName(nombreRadioButtons);
    return esCheckedRadioButtonsByRadios(radios);
};

FormUtil.esCheckedRadioButtonsByRadios = function(radios) {
    for (var i = 0, length = radios.length; i < length; i++) {
        if (radios[i].checked) 
            return true;
    }
    return false;
};





//------------------------------------------------------------------------------
//-------------------- Clase Formulario ----------------------------------------
//------------------------------------------------------------------------------

function Formulario() {
    
    var i = 0;
    var controles = new Array();
    var validacionesGrupales = new Array();
    
    //Metodos
    this.input = function(idInput,etiqueta) {
        var control = new Control(idInput,etiqueta);        
        if(control.isInicializado()) {
            controles[i++] = control;
        }
        return control;
    };
    
    function ValidacionVacio_NoVacio(idInputArray,mensaje) {
        this.mensaje = mensaje;
        this.idInputArray = idInputArray;
        
        this.validar = function() {
            //var n = this.idInputArray.length;
            var n = 0;//numero total de campos existentes
            var n_deshabilitados = 0;
            var n_vacios = 0;
            var n_noVacios = 0;
            
            var inputVacio;
            for(var t=0; t<n; t++) {                
                var input = document.getElementById(this.idInputArray[t]);
                if(input) {
                    if(input.disabled)
                        n_deshabilitados++;
                    else {
                        var v = trim(input.value);
                        if(v=="") {
                            n_vacios++;
                            inputVacio = input;
                        }
                        else
                            n_noVacios++;
                    }
                    n++;
                }
            }
            
            if(n_deshabilitados==n) {
                return true;
            }            
            if(n_vacios==n) {
                return true;
            }
            if(n_noVacios==n) {
                return true;
            }
            inputVacio.focus();
            alert(this.mensaje);
            return false;
        };
    }
    
    this.vacios_noVacios = function(idInputArray,mensaje) {
        var i = validacionesGrupales.length;
        validacionesGrupales[i] = new ValidacionVacio_NoVacio(idInputArray,mensaje);
    };
        
    this.esValido = function() {
        for(var t in controles) {  //este for each si funciona en IE
            //porque algunos inputs puede ser cargados con ajax posteriormente al cargado inicial de la pagina
            controles[t].inicializar(true);
            if(!controles[t].esValido()) {
                return false;
            }
        } 
        
        var n = validacionesGrupales.length;
        for(var t=0; t<n; t++) {
            if(!validacionesGrupales[t].validar())
                return false;
        }
        return true;
    };
    
    //Clase Interior
    function Control(idInput,etiqueta) {
        //Constructor
        this.idInput = idInput;       
        this.etiqueta = etiqueta;  
        var iValidaciones = 0;
        var validaciones = new Array();
        var inicializado;               
        
        this.isInicializado = function() {
            return inicializado;
        }
        
        this.inicializar = function(mostrarAdvertencia) {
            
            //if(inicializado)
            //    return ;
            
            var idInput = this.idInput;
            //alert("inicializando "+idInput);            
            inicializado = true;
            this.input = FormUtil.getInputOne(idInput);
            if(!this.input) {            
                this.buttons = FormUtil.getButtons(idInput);
                if(!this.buttons) {
                    //alert("No inicializado");
                    inicializado = false;
                }
            }    
            
            if(mostrarAdvertencia && !inicializado) {
                alert("input '"+idInput+"' no inicializado");
            }
        };
        
        this.inicializar(false);
        
        //http://stackoverflow.com/questions/8838648/onchange-event-handler-for-radio-button-input-type-radio-doesnt-work-as-one
        this.onchange = function(funcion_onchange) {  
            //this.inicializar(true);
            var buttons = this.buttons;
            if(buttons) {
                for (var i = 0; i < buttons.length; i++) {
                    buttons[i].onclick = funcion_onchange;
                }            
                funcion_onchange();//para inicializar el elemento
            }
        };
        
        this.debeCumplir = function(funcion_validacion) {              
            var val = new ValidacionGeneral(this);
            val.funcion_validacion_personalizada = funcion_validacion;
            validaciones[iValidaciones++] = val;  
            return this;
        };
        
        this.esNoVacio = function(mensaje) {       
            var val = new ValidacionNoVacio(this);
            val.mensaje = mensaje;            
            validaciones[iValidaciones++] = val;  
            return this;
        };
                
        this.esFecha = function(){
            var val = new ValidacionFecha(this);
            validaciones[iValidaciones++] = val;             
            return this;
        }; 
        
        this.esValido = function() {
            for(var t in validaciones) {                
                if(!validaciones[t].validar()) {
                    return false;
                }
            }
            return true;
        };
    }// Fin Input 
    
    
    function ValidacionGeneral(control) {
        this.funcion_validacion_personalizada;
        
        this.validar = function() {
            //alert("ValidacionGeneral");
            return this.funcion_validacion_personalizada(control);
        };
    }
    
    function ValidacionNoVacio(control) {
        this.mensaje;
        
        this.validar = function() {
            var valido = true;
            
            var input = control.input;
            var buttons = control.buttons;
            if(input) {
                //alert(control.idInput+" "+input.disabled);
                if(!input.disabled && trim(input.value) == ""){                    
                    valido = false;
                }
                //alert("input '"+input.id+"'");
            }
            else if(buttons) {                
                var nHabilitados = 0;
                var inputHabilitado;
                var length = buttons.length;
                for (var i = 0; i < length; i++) {
                    if(!buttons[i].disabled) {
                        nHabilitados++;
                        inputHabilitado = buttons[i];
                        if(buttons[i].checked) 
                            return true;
                    }
                }
                
                if(nHabilitados>0) {
                    input = inputHabilitado;
                    valido = false;
                }
                //alert("buttons nHabilitados="+nHabilitados);
            }
            
            if(!valido) {
                if(this.mensaje)
                    alert(this.mensaje);//mensaje personalizado                
                else
                    alert("Falta '"+control.etiqueta+"'");
                //input.focus();
                FormUtil.focus(input);
            }
            return valido;
        };
    }
    
    function ValidacionFecha(control) {
       
        this.validar = function() {
            var input = control.input;
            //var input = document.getElementById(idInput);
            if(input) {//si existe
                valor = input.value;
                if(trim(valor)=='') return true;
                expreg = /^[0-3][0-9]\/(([0][1-9])|([1][0-2]))\/[1-2][0-9]{3}$/;
                resul = expreg.test(valor);
                if(!resul){
                        alert("Fecha incorrecta para '"+control.etiqueta+"'");
                        input.focus();
                        return false;
                }else{

                        cDia = valor.substring(0, 2);
                        cDia = cDia.substring(0, 1) === "0" ? cDia.substring(1,2) : cDia;
                        cMes = valor.substring(3, 5);
                        cMes = cMes.substring(0, 1) === "0" ? cMes.substring(1,2) : cMes;
                        fecha = new Date( parseInt(valor.substring(6, 10)), 
                                                          parseInt(cMes) - 1, 
                                                          parseInt(cDia) );
                        /*                                  
                        if(fecha.getFullYear() != 2013){
                                alert("Valor de Fecha fuera del rango de la Encuesta.1");
                                return false;
                        }

                        if( fecha.getMonth() != 7 && fecha.getMonth() != 8 && fecha.getMonth() != 9 && fecha.getMonth() != 10 && fecha.getMonth() != 11 && fecha.getMonth() != 12){

                                alert("Valor de Fecha fuera del rango de la Encuesta.2");
                                return false;				
                        }
                        */
                        input.value = (fecha.getDate()>9 ? fecha.getDate() : "0" + fecha.getDate()) + "/" + 
                                                   (fecha.getMonth()+1>9 ? (fecha.getMonth()+1) : "0" + (fecha.getMonth()+1)) + "/" + 
                                                   fecha.getFullYear();                    
                }
            }
            
            return true;
        };
    }
           

}